# decimal

Эта библиотека добавляет возможность работы с типом "decimal", который отсутствует в стандарте языка С. 

Тип decimal представляет десятичные числа в диапазоне от положительных 79,228,162,514,264,337,593,543,950,335 до отрицательных 79,228,162,514,264,337,593,543,950,335. Значение decimal по умолчанию равно 0.
decimal подходит для финансовых расчетов, которые требуют большого количества значимых целых и дробных цифр и отсутствия ошибок округления. Результат деления и умножения не страдает от потери точности.
decimal - это число с плавающей точкой, состоящее из знака, числового значения, и коэффициента масштабирования, который указывает положение десятичной точки, разделяющей целые и дробные части числового значения.
Двоичное представление decimal состоит из 1-разрядного знака, 96-разрядного целого числа и коэффициента масштабирования, используемого для указания того, какая его часть является десятичной дробью.
Коэффициент масштабирования неявно равен числу 10, возведенному в степень в диапазоне от 0 до 28. Следовательно, двоичное представление decimal имеет вид ((от -2^96 до 2^96) / 10^(от 0 до 28)), где -(2^96-1) равно минимальному значению, а 2^96-1 равно максимальному значению.

Реализован битовый массив 32x4 (int[4]), из них 96 бита для хранения числа, а 32 для знака и степени.

Сборка make, компилятор gcc.

## Арифметические операторы

Сложение\
int add(decimal value_1, decimal value_2, decimal *result)

Вычитание\
int sub(decimal value_1, decimal value_2, decimal *result)

Умножение\
int mul(decimal value_1, decimal value_2, decimal *result)

Деление\
int div(decimal value_1, decimal value_2, decimal *result)

Возвращаемое значение:\
0 - OK\
1 - число слишком велико или равно бесконечности\
2 - число слишком мало или равно отрицательной бесконечности\
3 - деление на 0

## Операторы сравнение

Меньше\
int is_less(decimal, decimal)

Меньше или равно\
int is_less_or_equal(decimal, decimal)

Больше\
int is_greater(decimal, decimal)

Больше или равно\
int is_greater_or_equal(decimal, decimal)

Равно\
int is_equal(decimal, decimal)

Не равно\
int is_not_equal(decimal, decimal)

Возвращаемое значение:\
0 - FALSE\
1 - TRUE

## Преобразователи

Из int\
int from_int_to_decimal(int src, decimal *dst)


Из float\
int from_float_to_decimal(float src, decimal *dst)


В int\
int from_decimal_to_int(decimal src, int *dst)


В float\
int from_decimal_to_float(decimal src, float *dst)

Возвращаемое значение:\
0 - OK\
1 - ошибка конвертации

## Другие функции

Округляет указанное число до ближайшего целого числа в сторону отрицательной бесконечности\
int floor(decimal value, decimal *result)

Округляет до ближайшего целого числа\
int round(decimal value, decimal *result)

Возвращает целые цифры указанного числа; любые дробные цифры отбрасываются, включая конечные нули\
int truncate(decimal value, decimal *result)

Возвращает результат умножения на -1\
int negate(decimal value, decimal *result)

Возвращаемое значение - код:\
0 - OK\
1 - ошибка вычисления

## P.S.

Это было задание от Школы 21, в коде везде добавлен префикс "21_"